package com.aica.service;


import com.aica.bo.UserAndRoleBo;
import com.aica.bo.UserMessageBo;
import com.aica.vo.request.*;
import com.aica.vo.ResultVo;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author yly
 * @since 2021-02-02
 */
public interface UserService {

    /**
     * 查询用户基本信息与角色信息
     * @param username 用户名
     * @return 用户基本信息与角色信息
     */
    UserAndRoleBo selectUserAndRoleByUsername(String username);

    /**
     * 查询用户的整体信息
     * @param username 用户名
     * @return 用户详细信息
     */
    UserMessageBo getUserMessageFromDataBase(String username);

    /**
     * 查询用户的整体信息(优先从缓存中获得数据)
     * 如果数据不存在则查询数据库获得数据，同时保存至缓存中
     * @param username 用户名
     * @return 用户详细信息
     */
    UserMessageBo getUserMessageFromRedis(String username);

    /**
     * 刷新redis内的用户信息
     * @param username 用户名
     * @return 用户详细信息
     */
    UserMessageBo refreshUserMessageOnRedis(String username);

    /**
     * 发送验证码
     * @param sendEmailCodeVo 目的地邮箱地址封装类
     * @return 发送结果
     */
    ResultVo<Object> sendEmail(SendEmailCodeVo sendEmailCodeVo);

    /**
     * 注册
     * @param registerVo 注册参数封装类
     * @return 状态码请查看ResultConstant
     */
    ResultVo<Object> register(RegisterVo registerVo);

    /**
     * 依靠旧密码修改密码
     * @param changePasswordByOldVo 新旧密码封装类
     * @param usernamePasswordAuthenticationToken token
     * @return 状态码请查看ResultConstant
     */
    ResultVo<Object> changePasswordByOld(
            ChangePasswordByOldVo changePasswordByOldVo,
            UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken);

    /**
     * 获得用户的详细信息
     * @param usernamePasswordAuthenticationToken token
     * @return 状态码请查看ResultConstant
     */
    ResultVo<Object> getUserInformation(
            UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken);

    /**
     * 更新用户个人信息
     * @param updateInformationVo 更新的内容
     * @param usernamePasswordAuthenticationToken token身份令牌
     * @return 状态码请查看ResultConstant
     */
    ResultVo<Object> updateInformation(
            UpdateInformationVo updateInformationVo,
            UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken);

    /**
     * 更新头像
     * @param uploadAvatarVo 头像信息请求封装
     * @param usernamePasswordAuthenticationToken token身份令牌
     * @return 状态码请查看ResultConstant
     */
    ResultVo<Object> refreshAvatar(
            UploadAvatarVo uploadAvatarVo,
            UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken);

}
